package com.dzx.currentency.threadPool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author DuanZhaoXu
 * @ClassName:
 * @Description:
 * @date 2018年11月21日 14:29:26
 */

/**
 * 线程池使用场景
 */
public class ThreadPoolExample2 {
    public static void  main(String[] args){
        /**
         *  fixedThreadPool 正规的线程池，由于核心池数 等于最大 池数，因此没有最大线程池，
         *              只有最大线程池 的线程才能被回收，因为没有最大线程池，所以无超时机制，
         *              队列大小无限制，除非线程池关闭了核心线程才会被回收，
         *              采用默认的AbortPolicy:不执行新任务，直接抛出异常，提示线程池已满
         *  return new ThreadPoolExecutor(nThreads, nThreads,
         *                                       0L, TimeUnit.MILLISECONDS,
         *                                       new LinkedBlockingQueue<Runnable>());
         *
         */
        ExecutorService service = Executors.newFixedThreadPool(10);

        /**
         *   newCachedThreadPool
         *  return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
         *                                       60L, TimeUnit.SECONDS,
         *                                       new SynchronousQueue<Runnable>());
         *
         * 只有非核心线程，最大线程数很大（Integer.MAX_VALUE），它会为每一个任务添加一个新的线程，
         * 这边有一个超时机制，当最大线程池中空闲的线程超过60s内没有用到的话，就会被回收。
         * 缺点就是没有考虑到系统的实际内存大小。
         * 采用默认的AbortPolicy:不执行新任务，直接抛出异常，提示线程池已满
         */
        service = Executors.newCachedThreadPool();


        /**
         *    return new FinalizableDelegatedExecutorService
         *             (new ThreadPoolExecutor(1, 1,
         *                                     0L, TimeUnit.MILLISECONDS,
         *                                     new LinkedBlockingQueue<Runnable>()));
         * 看这个名字就知道这个家伙是只有一个核心线程，就是一个孤家寡人，
         *通过指定的顺序将任务一个个丢到线程，都乖乖的排队等待执行，不处理并发的操作，不会被回收。确定就是一个人干活效率慢。
         */
        Executors.newSingleThreadExecutor();

        /**
         *   super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
         *               new DelayedWorkQueue());
         *    这个线程池就厉害了，是唯一一个有延迟执行和周期重复执行的线程池。
         *   它的核心线程池固定，非核心线程的数量没有限制，但是闲置时会立即会被回收。
         */
        Executors.newScheduledThreadPool(5);
    }
}
